import Cocoa

//var str = "Hello, playground"

/**
1.字符串的创建:
 1> 字面量创建
 2> 初始化器
2.多行字面量 """
3.特殊字符转译
4.扩展字符串分隔符
5.字符串的常见用法
 1> 可变字符串的拼接
 2> 字符串的遍历
 3> 字符串插值
 4> 获取字符串的下标
 5> 字符串的插入
 6> 字符串的删除操作
 7> 将subString转换成了string类型
 8> 判断两个字符串内容是否一致,使用 == 就可以了
 */

//1.字面量创建
//let str: String = ""
//print(str)
//
////2.初始化器 ()就相当于oc中的 alloc /init,构造函数,创建并初始化对象
//let str2 = String()
//print(str2)

//多行字面量. 如果你需要一个字符串是跨越多行的，那就使用多行字符串字面量 —— 由一对三个双引号包裹着的具有固定顺序的文本字符集：
//一个多行字符串字面量包含了所有的在开启和关闭引号（"""）中的行。这个字符从开启引号(""")之后的第一行开始，到关闭引号(""")之前为止。这就意味着字符串开启引号之后(""")或者结束引号(""")之前都没有换行符号。
//如果你的代码中，多行字符串字面量包含换行符的话，则多行字符串字面量中也会包含换行符。如果你想换行，以便加强代码的可读性，但是你又不想在你的多行字符串字面量中出现换行符的话，你可以用在行尾写一个反斜杠(\)作为续行符。

//let softWrappedQuotation = """
//   The White Rabbit put on his spectacles.  "Where shall I begin, \
//   please your Majesty?" he asked.
//
//  "Begin at the beginning," the King said gravely, "and go on \
//   till you come to the end; then stop."
// """
//print(softWrappedQuotation)



//为了让一个多行字符串字面量开始和结束于换行符，请将换行写在第一行和最后一行，例如：
//let lineBreaks = """
//
//This string starts with a line break.
//It also ends with a line break.
//
//"""
//print(lineBreaks)

//一个多行字符串字面量能够缩进来匹配周围的代码。关闭引号(""")之前的空白字符串告诉Swift编译器其他各行多少空白字符串需要忽略。然而，如果你在某行的前面写的空白字符串超出了关闭引号(""")之前的空白字符串，则超出部分将被包含在多行字符串字面量中。


//特殊字符转译
//let wiseWords = "\"he victims were not referred to by name\".-English"
//print(wiseWords)
//let dollarSign = "\u{24}"
//print(dollarSign)
//
//let blackHeart = "\u{2665}"
//let pinkHeart = "\u{1F496}"


//扩展字符串分隔符(raw string)
//let str0 = "line 1 \nline 2"  //这样直接换行
//print(str0)
//let str = #"line 1 \nline 2"#  //这样换行符还是会显示出来
//print(str)
//let str2 = #"line 1 \#nline 2"#  //要想打印时不显示换行符又能达到换行的目的,需要在"\"后面再加上一个"#"
//print(str2)
//let str3 = ##"line 1 \##nline 2"##  //换行符中的#数量要和前后的#数量一致,否则打不到换行的目的
//print(str3)


//字符串的常见用法
//let str = "hello"  //let修饰的常量,不可更改
//var str2 = "hello"
////var修饰变量可以直接使用"+"进行字符串的拼接
//str2 += " world"
//print(str)
//print(str2)


//字符串是值类型,赋值的时候直接将字符串的值拿过去
//let str = "hello"
//var str2 = str
//print(str == str2)  //打印的是true,说明字符串只是简单的赋值.    swift中不是非0即真,只有true和false
//
//str2.append(" how are you!")
//print(str2)
//
////字符串的遍历
//let str = "hello"
//for c in str {
//    print(c)
//}


//字符串插值
//print("6 * 7 = \(6 * 7)")
////字符串插值也可以使用在row string(扩展字符串分隔符)中
//print(#"7 * 8 = \(7 * 8)"#)
//print(#"7 * 8 = \#(7 * 8)"#)


//获取字符串的下标
//let str = "hello world!"
////获取字符串的首个下标字符
//print(str[str.startIndex])
////获取字符串最后一个下标的字符
//print(str[str.index(before: str.endIndex)])
////获取第一个下标后一个下标的字符
//print(str[str.index(after: str.startIndex)])
//
////获取指定范围内的字符(从下标为0的字符开始,获取到下标为10的字符)
//let index = str.index(str.startIndex, offsetBy: 10)
//print(str[index])


//字符串的插入
//var str = "hello"
////插入一个字符到指定的字符串索引中
//str.insert("!", at: str.endIndex)
//print(str)
////插入另一个字符串的内容到指定的字符串索引中
//str.insert(contentsOf: " world!", at: str.endIndex)
//print(str)


//字符串的删除操作
//var str = "hello world!"
////str.insert(contentsOf: "你好呀!", at: str.endIndex)
//////删除字符串的首个下标的字符
////str.removeFirst()
////str.remove(at: str.startIndex)
//////删除最后一个下标的字符
////str.removeLast()
////str.remove(at: str.index(before: str.endIndex))
////删除一段特定范围的字符
//let range = str.index(str.endIndex, offsetBy: -6)..<str.endIndex
//str.removeSubrange(range)
////删除所有字符
////str.removeAll()
//print(str)



//字符串string的子字符串是subString类型,subString拥有大部分string的方法,subString可以转换成string类型
//let str = "hello world"
//let str2 = str[str.firstIndex(of: "e") ?? str.endIndex]
//print(str2)
//
//let index = str.firstIndex(of: "e") ?? str.endIndex
//let str3 = str[..<index]
//print(str3)
//
//let index2 = str.firstIndex(of: ",") ?? str.endIndex
//let beginning = str[..<index2]
//print(beginning)
////将subString转换成了string类型
//let newString = String(beginning)


////判断两个字符串内容是否一致,使用 == 就可以了
let str = "hello"
let str2 = "hello world"
print(str == str2)
//
////判断字符串是否以...开头,使用hasPrefix
print(str.hasPrefix("hello"))
//判断字符串是否以...结尾,使用hasSuffix
print(str.hasSuffix("hello"))
print(str2.hasSuffix("world"))


























